home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / libs / unixlib.lha / unix / src / access.c < prev    next >
C/C++ Source or Header  |  1996-11-10  |  884b  |  42 lines

  1.  
  2. #include "amiga.h"
  3. #include <utility/tagitem.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6.  
  7. int __access(const char *name, int mode)
  8. {
  9.     struct FileInfoBlock *fib;
  10.     BPTR lock = 0;
  11.     int ret = -1;
  12.  
  13.     __chkabort();
  14.     if ((fib = AllocDosObjectTags(DOS_FIB, TAG_END)) &&
  15.         (lock = Lock(name, ACCESS_READ)) &&
  16.         Examine(lock, fib)) {
  17.     struct stat sbuf;
  18.     int fmode;
  19.     BPTR parent = ParentDir(lock);
  20.     int isroot = !parent;
  21.     long handler = (long)((struct FileLock *)((long)lock << 2))->fl_Task;
  22.  
  23.     if (parent)
  24.         UnLock(parent);
  25.     _fibstat(fib, isroot, &sbuf, handler);
  26.     fmode = (sbuf.st_mode & (S_IREAD | S_IEXEC)) >> 6 |
  27.         (sbuf.st_mode & (S_IWRITE >> 3)) >> 3;
  28.  
  29.     if ((fmode & mode) == mode)
  30.         ret = 0;
  31.     else
  32.         errno = EACCES;
  33.     } else
  34.     errno = convert_oserr(IoErr());
  35.  
  36.     if (lock)
  37.     UnLock(lock);
  38.     if (fib)
  39.     FreeDosObject(DOS_FIB, fib);
  40.     return ret;
  41. }
  42.